package com.lmuse.xmr.foodspotting.db;

import com.lmuse.xmr.foodspotting.BasePresenter;
import com.lmuse.xmr.foodspotting.model.Recipe;
import com.lmuse.xmr.foodspotting.model.User;
import com.lmuse.xmr.foodspotting.model._Article;

import java.util.List;

import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.exception.BmobException;

public interface Contract {

    interface UserView {
        void onSignUpSuccess(User user);

        void onSignUpFailed(String msg);

        void onSignInSuccess(User user);

        void onSignInFailed(String msg);

        void onUserInfoCache(User user);

        void onUpdateUserSuccess();

        void onUpdateUserFailed(String msg);

        void onRequestEmailVerifyResult(BmobException e);

        void onResetPasswordByEmailResult(BmobException e);

        void onQueryUserByIdSuccess(User user);

        void onQueryUserByIdFailed(String msg);

        void onQueryUserAmountSuccess(int size);

        void onQueryUserAmountFailed(String msg);

        void onQueryByKeySuccess(List<User> userList);

        void onQueryByKeyFailed(String msg);
    }

    interface UserPresenter extends BasePresenter{

        /**
         * 注册用户
         * @param username 即邮箱
         * @param password
         */
        void signUp(String username, String password);

        /**
         * 登录
         * @param username 即邮箱
         * @param password
         */
        void signIn(String username, String password);

        /**
         * 获取本地缓存用户信息
         */
        void getUserInfoCache();

        /**
         * 更新用户名
         * @param username （即邮箱）
         */
        void updateUsername(String username);

        /**
         * 更新用户昵称
         * @param nickname
         */
        void updateNickname(String nickname);

        /**
         * 更新用户密码
         * @param oldPwd
         * @param newPwd
         */
        void updatePassword(String oldPwd, String newPwd);

        /**
         * 退出登录
         */
        void logOut();

        /**
         * 重新发送验证邮箱
         */
        void requestEmailVerify();

        /**
         * 邮箱重置密码（忘记密码时重置密码）
         * @param email
         */
        void resetPasswordByEmail(String email);

        /**
         * 根据objectId查询该用户信息
         * @param objectId
         */
        void queryUserById(String objectId);

        /**
         * 查询用户总数
         */
        void queryUserAmount();

        /**
         * 查询指定列
         * @param rowName
         */
        void queryByKey(String rowName);
    }

    interface CollectView {

        void onCollectRecipeSuccess();

        void onCollectRecipeFailed(String msg);

        void onCancelCollectSuccess();

        void onCancelCollectFailed(String msg);

        void onQueryCollectingSuccess(List<Recipe> recipeList);

        void onQueryCollectingFailed(String msg);
    }

    interface CollectPresenter extends BasePresenter{

        /**
         * 收藏菜谱
         * @param recipeId
         */
        void collectRecipe(String recipeId);

        /**
         *取消收藏
         * @param recipeId
         */
        void cancelCollectRecipe(String recipeId);

        /**
         * 查询用户收藏的所有菜谱
         */
        void queryCollecting();
    }

    interface FollowView {

        void onAddFollowingSuccess();

        void onAddFollowingFailed(String msg);

        void onUnFollowingSuccess();

        void onUnFollowingFailed(String msg);

        void onQueryFollowingSuccess(List<User> userList);

        void onQueryFollowingFailed(String msg);

        @Deprecated
        void onQueryFollowerSuccess(List<User> userList);

        @Deprecated
        void onQueryFollowerFailed(String msg);

        void onQueryFollowerAmountSuccess(Integer num);

        void onQueryFollowerAmountFailed(String msg);
    }

    interface FollowPresenter extends BasePresenter {

        /**
         *加关注
         * @param followingId 被关注用户id
         */
        void addFollowing(String followingId);

        /**
         * 取消关注
         * @param followingId 要取消关注的用户id
         */
        void unFollowing(String followingId);

        /**
         * 查询关注的用户
         */
        void queryFollowings();

        /**
         * 查询关注我的用户  bmob 未登录无法修改用户表
         */
        @Deprecated
        void queryFollowers();

        /**
         * 查询粉丝数
         */
        void queryMyFollowersAmount();
    }

    interface RecipeView {

        /**
         * Cover图片上传中
         * @param value 上传进度百分比
         */
        void onUploadingImg(Integer value);

        /**
         * Content图片上传中
         * @param curIndex 当前第curIndex个文件正在上传
         * @param curPercent  当前上传文件的进度值（百分比）
         * @param total  总的上传文件数
         * @param totalPercent  总的上传进度（百分比）
         */
        void onUploadingImg(int curIndex, int curPercent, int total, int totalPercent);

        /**
         * Cover图片上传成功
         * @param cover BmobFile.getFileUrl即可获取文件url
         */
        void onUploadImgSuccess(BmobFile cover);

        /**
         * Content图片上传成功
         * @param urls url 集合
         */
        void onUploadImgSuccess(List<String> urls);

        void onUploadImgFailed(String msg);

        void onAddRecipeSuccess();

        void onAddRecipeFailed(String msg);

        void onQueryRecipeSuccess(Recipe recipe);

        void onQueryRecipeSuccess(List<Recipe> recipeList);

        void onQueryRecipeFailed(String msg);

        void onQueryKeySuccess(List<Recipe> recipeKeyList);

        void onQueryKeyFailed(String msg);

        void onDeleteRecipeSuccess();

        void onDeleteRecipeFailed(String msg);
    }

    interface RecipePresenter extends BasePresenter{

        /**
         * 上传本地图片获取url
         * @param filePath 封面中的图片
         */
        void uploadImgFile(String filePath);

        /**
         * 上传本地图片获取url
         * @param filePaths Content中的图片
         */
        void uploadImgFile(String[] filePaths);

        /**
         * 添加一个食谱
         * @param title
         * @param coverUrl
         * @param label
         * @param content
         */
        void addRecipe(String title, String coverUrl, String label, String content);

        /**
         * 查询分页菜单
         * @param rowName 查询列名
         * @param condition 查询条件
         * @param limit 每页查询条数
         * @param page 页码
         */
        void queryRecipe(String rowName, String condition, int limit, int page);

        /**
         * 查询菜单（不分页）
         * @param rowName 查询列名
         * @param condition 查询条件
         * @param limit 查询条数
         */
        void queryRecipe(String rowName, String condition, int limit);

        /**
         * 查询指定列
         * @param rowName
         */
        void queryByKey(String rowName);

        /**
         * 删除菜谱（管理员）
         * @param objectId
         */
        void deleteRecipe(String objectId);
    }

    interface ArticleView {

        void onQueryArticleSuccess(List<_Article> articleList);

        void onQueryArticleFailed(String msg);
    }

    interface ArticlePresenter {

        /**
         * 查询首页banner的素材
         */
        void queryArticle();
    }

    interface DiscoverView {

        void onQueryDiscoverRecipeSuccess(List<Recipe> recipeList);

        void onQueryDiscoverRecipeFailed(String msg);
    }

    interface DiscoverPresenter {

        /**
         * 查询我关注的用户发表的食谱
         * 复合或查询
         * @param objectIdList 关注用户的objectId
         */
        void queryDiscoverRecipe(List<String> objectIdList);
    }
}
